//给你一个大小为 m * n 的矩阵 mat，矩阵由若干军人和平民组成，分别用 1 和 0 表示。 
//
// 请你返回矩阵中战斗力最弱的 k 行的索引，按从最弱到最强排序。 
//
// 如果第 i 行的军人数量少于第 j 行，或者两行军人数量相同但 i 小于 j，那么我们认为第 i 行的战斗力比第 j 行弱。 
//
// 军人 总是 排在一行中的靠前位置，也就是说 1 总是出现在 0 之前。 
//
// 
//
// 示例 1： 
//
// 
//输入：mat = 
//[[1,1,0,0,0],
// [1,1,1,1,0],
// [1,0,0,0,0],
// [1,1,0,0,0],
// [1,1,1,1,1]], 
//k = 3
//输出：[2,0,3]
//解释：
//每行中的军人数目：
//行 0 -> 2 
//行 1 -> 4 
//行 2 -> 1 
//行 3 -> 2 
//行 4 -> 5 
//从最弱到最强对这些行排序后得到 [2,0,3,1,4]
// 
//
// 示例 2： 
//
// 
//输入：mat = 
//[[1,0,0,0],
// [1,1,1,1],
// [1,0,0,0],
// [1,0,0,0]], 
//k = 2
//输出：[0,2]
//解释： 
//每行中的军人数目：
//行 0 -> 1 
//行 1 -> 4 
//行 2 -> 1 
//行 3 -> 1 
//从最弱到最强对这些行排序后得到 [0,2,3,1]
// 
//
// 
//
// 提示： 
//
// 
// m == mat.length 
// n == mat[i].length 
// 2 <= n, m <= 100 
// 1 <= k <= m 
// matrix[i][j] 不是 0 就是 1 
// 
// Related Topics 数组 二分查找 矩阵 排序 堆（优先队列） 
// 👍 117 👎 0

package leetcode.editor.cn;

import java.util.Arrays;

//Java：矩阵中战斗力最弱的 K 行
public class TheKWeakestRowsInAMatrix_1337 {
    public static void main(String[] args) {
        Solution solution = new TheKWeakestRowsInAMatrix_1337().new Solution();
        // TO TEST
        //int[][] in = {{1, 1, 0}, {1, 0, 0}, {1, 0, 0}, {1, 1, 1}, {1, 1, 0}, {0, 0, 0}};
        //int[] ints = solution.kWeakestRows(in, 4);
        int[][] in2 = {{1, 1, 1, 0}, {1, 1, 0, 0}, {1, 1, 1, 1}, {1, 1, 1, 1}, {0, 0, 0, 0}, {1, 1, 1, 0}};
        int[] ints2 = solution.kWeakestRows(in2, 6);
        System.out.println(Arrays.toString(ints2));
    }

    /**
     * 先求和，再排序
     */
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int[] kWeakestRows(int[][] mat, int k) {
            int[][] sort = new int[mat.length + mat[0].length][2];
            int sum;
            for (int m = 0; m < mat.length; m++) {
                sum = 0;
                for (int n : mat[m]) {
                    if (n == 0) {
                        break;
                    }
                    sum += n;
                }

                int[] index = new int[]{m + 1, sum};
                int[] temp;
                for (int i = sum; ; i++) {
                    if (sort[i][0] == 0) {
                        sort[i] = index;
                        break;
                    }
                    int[] t = sort[i];
                    if ((t[1] > index[1]) || (t[1] == index[1] && t[0] > index[0])) {
                        temp = sort[i];
                        sort[i] = index;
                        index = temp;
                    }
                }
            }
            int[] result = new int[k];
            int i = 0;
            for (int[] s : sort) {
                if (k == i) {
                    return result;
                }
                if (s[0] != 0) {
                    result[i] = s[0] - 1;
                    i++;
                }
            }
            return result;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}